import 'dart:async';
import 'package:flutter/material.dart';
import 'package:event_bus/event_bus.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const FirstPage(key: Key('1'),),
    );
  }
}

// EventBus的使用方式灵活，可以支持任意对象的传递。
// 所以在这里，我们传输数据的载体就选择了一个有字符串属性的自定义事件类CustomEvent：
class CustomEvent {
  String msg;
  CustomEvent(this.msg);
}

// 定义了一个全局的eventBus对象
EventBus eventBus = new EventBus();

class FirstPage extends StatefulWidget {
  const FirstPage({required Key key}) : super(key: key);

  @override
  FirstState createState() => FirstState();
}

//第一个页面
class FirstState extends  State<FirstPage>  {

  String msg = "通知：";
  late StreamSubscription subscription;

  @override
  initState() {

    // 第一个页面监听了CustomEvent事件，一旦收到事件，就会刷新UI
    subscription = eventBus.on<CustomEvent>().listen((event) {
      setState(() {msg+= event.msg;});//更新msg
    });
    super.initState();
  }
  @override
  dispose() {
    // 需要注意的是，千万别忘了在State被销毁时清理掉事件注册，否则你会发现State永远被EventBus持有着，无法释放，从而造成内存泄漏
    subscription.cancel();//State销毁时，清理注册
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body:Column(children: [Text(msg), FilledButton(onPressed: ()=> Navigator.push(context, MaterialPageRoute(builder: (context) => const SecondPage())), child: const Text('second page'))],),
    );
  }
}

class SecondPage extends StatelessWidget {
  const SecondPage({super.key});

  @override
  Widget build(BuildContext context) {
    return FilledButton(
      // 以按钮点击回调的方式，触发了CustomEvent事件
      onPressed: ()=> eventBus.fire(CustomEvent("hello")), child: const Text('Send hello'),
    );
  }
}
